home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / micq-0.4.0 / server.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  9KB  |  335 lines

  1. #include "micq.h"
  2. #include "datatype.h"
  3. #include "msg_queue.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #ifdef _WIN32
  8. #include <conio.h>
  9. #include <io.h>
  10. #include <winsock2.h>
  11. #include <time.h>
  12. #else
  13. #include <unistd.h>
  14. #include <netinet/in.h>
  15. #include <sys/types.h>
  16. #include <sys/stat.h>
  17. #include <sys/socket.h>
  18. #include <arpa/inet.h>
  19. #include <netdb.h>
  20. #include <sys/time.h>
  21. #include <sys/wait.h>
  22. #include "mreadline.h"
  23. #endif
  24. #include <fcntl.h>
  25. #include <time.h>
  26. #include <stdarg.h>
  27. #include <string.h>
  28. #include <ctype.h>
  29. #include <assert.h>
  30. #include <limits.h>
  31. #ifdef __SASC
  32. #include "amiga-dt.h"
  33. #endif
  34.  
  35. /*extern unsigned int next_resend;*/
  36. /*extern BOOL serv_mess[ 1024 ];  used so that we don't get duplicate messages with the same SEQ */
  37.  
  38. static void Multi_Packet( SOK_T sok, BYTE *data )
  39. {
  40.    int num_pack, i;
  41.    int len;
  42.    BYTE * j;
  43.    srv_net_icq_pak pak;
  44.    num_pack = (unsigned char) data[0];
  45.    j = data;
  46.    j++;
  47.    
  48.    for ( i=0; i < num_pack; i++ )
  49.    {
  50.        len = Chars_2_Word( j );
  51. /*       pak = *( srv_net_icq_pak *) j ;*/
  52.        memcpy( &pak, j, sizeof( pak ) );
  53.        j += 2;
  54. #if 0
  55.        M_print( "\nPacket Number %d\n", i );
  56.        M_print( LENGTH_STR " %04X\n", len );
  57.        M_print( COMMAND_STR " %04X\n", Chars_2_Word( pak.head.cmd ) );
  58.        M_print( SEQ_STR " %04X\n", Chars_2_Word( pak.head.seq ) );
  59.        M_print( VER_STR " %04X\n", Chars_2_Word( pak.head.ver ) );
  60. #endif
  61.       Kill_Prompt();
  62.        Server_Response( sok, pak.data, (len+2) - sizeof( pak.head ), Chars_2_Word( pak.head.cmd ),
  63.                  Chars_2_Word( pak.head.ver ), Chars_2_Word( pak.head.seq )
  64.                  , Chars_2_Word( pak.head.UIN ) );
  65.        j += len;
  66.    }
  67. }
  68.  
  69. void Server_Response( SOK_T sok, BYTE *data, DWORD len, WORD cmd, WORD ver, DWORD seq, DWORD uin )
  70. {
  71.    SIMPLE_MESSAGE_PTR s_mesg;
  72.    char *temp;
  73.    
  74.    switch ( cmd )
  75.    {
  76.    case SRV_ACK:
  77. /*      Dump_Queue();*/
  78.       if ( Verbose ) {
  79.      Kill_Prompt();
  80.      R_undraw ();
  81.       }
  82.       if ( Verbose > 1 )
  83.       {
  84.          M_print( SERVER_ACK_STR "\n", last_cmd[ seq>>16 ] );
  85.          M_print( "The SEQ was %04X\n", seq );
  86.       }
  87.       Check_Queue( seq );
  88.       if ( Verbose ) {
  89.      if ( len != 0 )
  90.      {
  91.         M_print( EXTRA_DATA_STR " " LENGTH_STR " %d\n", len );
  92.         Hex_Dump( data, len );
  93.      }
  94.      R_redraw ();
  95.       }
  96.       break;
  97.    case SRV_META_USER:
  98.       R_undraw ();
  99.       Meta_User( sok, data, len, uin );
  100.       R_redraw ();
  101.       break;
  102.    case SRV_MULTI_PACKET:
  103. /*      printf( "\n" );
  104.       Hex_Dump( data, len );*/
  105.       Multi_Packet( sok, data );
  106.       break;
  107.    case SRV_NEW_UIN:
  108.       R_undraw ();
  109.       M_print( "The new UIN is %ld!\n", uin );
  110.       R_redraw ();
  111.       break;
  112.    case SRV_UPDATE_FAIL:
  113.       R_undraw ();
  114.       M_print( "Failed to update info.\n" );
  115.       R_redraw ();
  116.       break;
  117.    case SRV_UPDATE_SUCCESS:
  118.       R_undraw ();
  119.       M_print( "User info successfully updated.\n" );
  120.       R_redraw ();
  121.       break;      
  122.    case SRV_LOGIN_REPLY:
  123. /*      UIN = Chars_2_DW( &pak.data[0] ); */
  124.       R_undraw ();
  125.       our_ip = Chars_2_DW( &data[0] );
  126.       M_print( LOGIN_SUCCESS_STR " UIN : %lu\n", uin );
  127. #if ICQ_VER == 0x0002
  128.       M_print( " IP : %u.%u.%u.%u\t", data[4], data[5], data[6], data[7] );
  129. #elif ICQ_VER == 0x0004
  130.       M_print( " IP : %u.%u.%u.%u\t", data[0], data[1], data[2], data[3] );
  131. #else
  132.       M_print( " IP : %u.%u.%u.%u\t", data[12], data[13], data[14], data[15] );
  133. #endif
  134.       Time_Stamp();
  135.       M_print( "\n" );
  136.       snd_login_1( sok );
  137.       snd_contact_list( sok );
  138.       snd_invis_list( sok );
  139.       snd_vis_list( sok );
  140.       Current_Status = set_status;
  141. /*      icq_change_status( sok, set_status );*/
  142. /*      Prompt();*/
  143.       R_redraw ();
  144.       break;
  145.    case SRV_RECV_MESSAGE:
  146.          R_undraw();
  147.          Recv_Message( sok, data );
  148.      M_print( "\n" );
  149.          R_redraw();
  150.       break;
  151.    case SRV_X1: 
  152.       R_undraw ();
  153.       if ( Verbose ) {
  154.          M_print( "Acknowleged SRV_X1 0x021C Done Contact list?\n" );
  155.       }
  156.       Show_Quick_Status();
  157.       R_redraw ();
  158.       Done_Login = TRUE;
  159.       break;
  160.    case SRV_X2: 
  161.       Kill_Prompt();
  162.       if ( Verbose ) {
  163.          R_undraw ();
  164.          M_print( "Acknowleged SRV_X2 0x00E6 Done old messages?\n" );
  165.          R_redraw ();
  166.       }
  167.       snd_got_messages( sok );
  168.       break;
  169.    case SRV_INFO_REPLY:
  170.       R_undraw ();
  171.       Display_Info_Reply( sok, data );
  172.       M_print( "\n" );
  173.       R_redraw ();
  174.       break;
  175.    case SRV_EXT_INFO_REPLY:
  176.       R_undraw ();
  177.       Display_Ext_Info_Reply( sok, data );
  178.       M_print( "\n" );
  179.       R_redraw ();
  180.       break;
  181.    case SRV_USER_OFFLINE:
  182.       R_undraw ();
  183.       User_Offline( sok, data );
  184.       M_print( "\n" );
  185.       R_redraw ();
  186.       break;
  187.    case SRV_BAD_PASS:
  188.       R_undraw ();
  189.       M_print( MESSCOL "You entered an incorrect password." NOCOL "\n" );
  190.       exit( 1 );
  191.       break;
  192.    case SRV_TRY_AGAIN:
  193.       R_undraw ();
  194.       M_print( MESSCOL "Server is busy please try again.\nTrying again...\n");
  195. #ifdef UNIX
  196.       if ( fork() == 0 )
  197.       {
  198.          sleep( 5 );
  199.          Login( sok, UIN, &passwd[0], our_ip, our_port, set_status );
  200.          exit( 0 );
  201.       }
  202. #else
  203.       Login( sok, UIN, &passwd[0], our_ip, our_port, set_status );
  204. #endif
  205.      R_redraw ();
  206.      break;
  207.    case SRV_USER_ONLINE:
  208.       R_undraw ();
  209.       User_Online( sok, data );
  210.       M_print( "\n" );
  211.       R_redraw ();
  212.       break;
  213.    case SRV_STATUS_UPDATE:
  214.       R_undraw ();
  215.       Status_Update( sok, data );
  216.       M_print( "\n" );
  217.       R_redraw ();
  218.       break;
  219.    case SRV_GO_AWAY:
  220.    case SRV_NOT_CONNECTED:
  221.       R_undraw ();
  222.       #ifdef FUNNY_MSGS 
  223.       M_print( "Server sent \"Go away!!\" command.\t" );
  224.       #else
  225.       M_print( "Server has forced us to disconnect.  This may be because of network lag.\t" );
  226.       #endif
  227.       Time_Stamp();
  228.       Quit = TRUE;
  229.       M_print ("\n");
  230.       R_redraw ();
  231.       break;
  232.    case SRV_END_OF_SEARCH:
  233.       R_undraw ();
  234.       M_print( SEARCH_DONE_STR );
  235.       if ( len >= 1 ) {
  236.          if (  data[0] == 1 ) {
  237.             M_print( "\t" TOO_MANY_STR  );
  238.      } else {
  239.             M_print( "\t" ALL_FOUND_STR );
  240.      }
  241.       } 
  242.       M_print ("\n");
  243.       R_redraw ();
  244.       break;
  245.    case SRV_USER_FOUND:
  246.       R_undraw ();
  247.       Display_Search_Reply( sok, data );
  248.       M_print ("\n");
  249.       R_redraw ();
  250.       break;
  251.    case SRV_RAND_USER:
  252.       R_undraw ();
  253.       Display_Rand_User( sok, data, len );
  254.       M_print ("\n");
  255.       R_redraw ();
  256.       break;
  257.    case SRV_SYS_DELIVERED_MESS:
  258.       R_undraw ();
  259.       s_mesg = ( SIMPLE_MESSAGE_PTR ) data;
  260.       last_recv_uin = Chars_2_DW( s_mesg->uin );
  261.       Print_UIN_Name( Chars_2_DW( s_mesg->uin  ) );
  262.       if ( 0 == ( Chars_2_Word( s_mesg->type ) & MASS_MESS_MASK ) )
  263.          M_print( " - Instant Message\a " );
  264.       else
  265.          M_print( " - Instant " SERVCOL "Mass" NOCOL " Message\a " );
  266.       if ( Verbose )
  267.          M_print( " Type = %04x\t", Chars_2_Word( s_mesg->type ) );
  268.       Time_Stamp();
  269.       Do_Msg( sok, Chars_2_Word( s_mesg->type ), Chars_2_Word( s_mesg->len ), 
  270.            s_mesg->len + 2,last_recv_uin); 
  271.       if ( 0xfe != *( ((unsigned char *) s_mesg ) + sizeof( s_mesg ) ) )
  272.       {
  273.          if ( auto_resp &&
  274.         (Current_Status != STATUS_ONLINE) &&
  275.         (Current_Status != STATUS_FREE_CHAT)  )
  276.          {
  277.         switch ( Current_Status & 0x1ff )
  278.         {
  279.         case STATUS_OCCUPIED:
  280.            /* Dup the string so the russian translation only happens once */
  281.            temp = strdup( auto_rep_str_occ );
  282.            icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  283.            break;
  284.         case STATUS_AWAY:
  285.            temp = strdup( auto_rep_str_away );
  286.            icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  287.            break;
  288.         case STATUS_DND:
  289.            temp = strdup( auto_rep_str_dnd );
  290.            icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  291.            break;
  292.         case STATUS_INVISIBLE:
  293.            temp = strdup( auto_rep_str_inv );
  294.            icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  295.            break;
  296.         case STATUS_NA:
  297.            temp = strdup( auto_rep_str_na );
  298.            icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  299.            break;
  300.         default:
  301.            temp = strdup(